package org.komarichin.google;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.gson.GsonBuilder;
import org.apache.commons.lang.StringUtils;
import org.komarichin.Configurator;
import org.komarichin.google.search.ResponseData;
import org.komarichin.google.search.deserializers.ResponseDataDeserializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

/**
 * User: Mykhaylo Komarichyn
 * Date: 12.01.2010
 * Time: 18:20:04
 */
@Service
public class GoogleService implements IGoogleService {
    private static final Logger log = LoggerFactory.getLogger(GoogleService.class);

    @Autowired
    private Configurator configurator;
    private final UserService service = UserServiceFactory.getUserService();

    /**
     * Возвращает URL страницы входа для пользователя.
     *
     * @param s URL-адрес, по которому пользователь будет перенаправлен после выполнения входа.
     * @return URL страницы входа.
     */
    @Override
    public String createLoginURL(String s) {
        return service.createLoginURL(s);
    }


    /**
     * Возвращает URL для выполнения выхода из приложения текущим пользователем.
     *
     * @param s URL-адрес, по которому пользователь будет перенаправлен после выполнения выхода.
     * @return URL для выполнения выхода.
     */
    @Override
    public String createLogoutURL(String s) {
        return service.createLogoutURL(s);
    }


    /**
     * Возвращает true, если какой-либо пользователь выполнил вход, и false в противном случае.
     *
     * @return Возвращает true, если какой-либо пользователь выполнил вход, и false в противном случае.
     */
    @Override
    public boolean isUserLoggedIn() {
        return service.isUserLoggedIn();
    }

    /**
     * Возвращает true, если запрос выполняет администратор приложения, и false в противном случае.
     *
     * @return Возвращает true, если запрос выполняет администратор приложения, и false в противном случае.
     */
    @Override
    public boolean isUserAdmin() {
        return service.isUserLoggedIn() && service.isUserAdmin();
    }

    @Override
    public String getUserNickname() {
        if (isUserLoggedIn())
            return service.getCurrentUser().getNickname();
        else return null;
    }

    @Override
    public String getAuthDomain() {
        if (isUserLoggedIn())
            return service.getCurrentUser().getNickname();
        else return null;
    }

    @Override
    public String getEmail() {
        if (isUserLoggedIn())
            return service.getCurrentUser().getEmail();
        else return null;
    }

    /**
     * @param searchQuery searching query
     * @param domain      searching domain
     * @param start       next result
     * @return resutl searche
     * @{see http://code.google.com/intl/ru/apis/ajaxsearch/documentation/}
     */
    @Override
    public ResponseData getResultByQuery(String searchQuery, String domain, long start) {
        StringBuilder query = new StringBuilder("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&ie=UTF-8&q=");
        if (StringUtils.isNotEmpty(domain))
            query.append("site:").append(domain).append("+");
        try {
            query.append(URLEncoder.encode(searchQuery.trim(), "UTF-8"));
            query.append("&hl=ru");
            query.append("&key=ABQIAAAAO88jreK-tiJst9aBaTaZnhSHOTgpO5u0fanZEC5RQq5lPs1XwBQ85kKhIcQgFR9JRjWBzYzd-tCs7w");
            if (start != 0) {
                query.append("&start=").append(start);
            }
            log.debug("search query:{}", query.toString());
            URL url = new URL(query.toString());
            URLConnection connection = url.openConnection();
            connection.addRequestProperty("Referer", "http://" + domain);
            connection.addRequestProperty("Accept-Language", "ru");


            String line;
            StringBuilder builder = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }


            log.debug("result from google: \n{}", builder.toString());
            GsonBuilder gson = new GsonBuilder();
            gson.registerTypeAdapter(ResponseData.class, new ResponseDataDeserializer());

            return gson.create().fromJson(builder.toString(), ResponseData.class);
        } catch (MalformedURLException e) {
            log.error(e.getMessage(), e);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

}
